﻿
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Sockets;
using static ss.Program;

namespace ss
{
    class LengthCoding
    {
        public static byte[] DeCode(ref List<byte> buffer)
        {
            byte[] arr = buffer.ToArray();
            if (arr.Length < 4)//证明列表里面没有东西，无法解析分包
            {
                return null;
            }
            int bodyLength = BitConverter.ToInt32(arr);//解析确保大小端正确
            if (bodyLength > arr.Length - 4) return null;
            byte[] rec = new byte[bodyLength];
            ByteArray.Copy(arr, 4, rec, 0, bodyLength);
            buffer.Clear();//清除列表
            int L = arr.Length - bodyLength - 4;
            if (L > 0)
            {
                byte[] arr1 = new byte[L];
                ByteArray.Copy(arr, bodyLength + 4, arr1, 0, L);
                buffer.AddRange(arr1);// 将剩余没有读取到的东西添加进列表中，等下次再来读取
            }
            return rec;//将新数组返回出去
        }
        public static byte[] DeCode1(ref List<byte> buffer)
        {
            if (buffer.Count < 4)//证明列表里面没有东西，无法解析分包
            {
                return null;
            }
            MemoryStream ms = new MemoryStream(buffer.ToArray());//实例化内存流
            BinaryReader br = new BinaryReader(ms);//实例化读取流
            int length = br.ReadInt32();//读取长度，判断是否能解析分包
            if (length > (int)(ms.Length - ms.Position))//证明还不足以解析分包
            {
                return null;
            }
            byte[] result = br.ReadBytes(length);//读取length长度的数据
            buffer.Clear();//清除列表
            buffer.AddRange(br.ReadBytes((int)(ms.Length - ms.Position)));// 将剩余没有读取到的东西添加进列表中，等下次再来读取
            br.Close();//关闭读取流
            ms.Close();//关闭内存流
            return result;//将新数组返回出去
        }
    }
}
